在上一篇文章《 page.on('response',fn)的最佳实践之等待响应 》中,我们为 page.on('response',fn) 封装了两个函数来分别达到“长时间情况下获取一个或多个响应”的目的。
理论上,封装的这两个函数是在变相的手动实现 page.waitForResponse 功能点。那么,在不同的场景下,我们又该如何选择使用它们呢?除了之前讨论的等待时间长短之外,今天,我们将从资源开销的角度来给出它们的优劣势。
首先,关于“获取单个响应”的资源占用
在面对一个不确定多久才会返回的响应时,`page.waitForResponse` 和 `page.on('response',fn) - 配合 Promise 和超时机制` 在资源占用方面是相似的。
因为,无论是哪种方法,为了等待一个可能很慢或永不返回的事件,都需要:
一个
Promise 对象来管理异步状态;一个 超时定时器来防止无限期等待;
一个 事件监听器来等待事件触发;
所以,只要你 正确地 处理了超时和监听器的清理,这两种方法在等待 单个 响应时,资源占用并没有本质区别。
其次,关于“获取多个响应”的资源占用
当需要获取多个符合条件的响应时,page.on('response',fn) 模式的内存损耗比 page.waitForResponse 低。
page.on 模式:你可以用 一个
Promise和 一个page.on 监听器,来收集所有符合条件的响应。你只需要在满足特定条件(如收集到 5 个响应)时,一次性 resolve 这个 Promise,并移除监听器。这种模式的资源开销是 固定的。page.waitForResponse 模式:这个 API 的设计就是为了等待 单个 响应。如果要获取多个响应,你必须:
连续调用
await page.waitForResponse(...)多次。或者使用
Promise.all([page.waitForResponse(...), page.waitForResponse(...)])。
但,无论是 page.waitForResponse 的哪种方式,你每等待一个响应,都需要创建一个新的 Promise 实例和新的监听器。这就意味着,获取 N 个响应,你需要 N 个 Promise 和 N 个监听器。在短时间内创建和管理大量这些对象,其内存和 CPU 开销自然会比 page.on 的单实例模式更高。
最终结论
所以,综合之前的文章内容,再结合今天阐述的资源开销对比项,我们就可以汇总成这样一个表格,以此来帮助我们在不同的场景下选择更合适的监听器:











